#include "mainwidget.h"

#include <QPushButton>
#include <QDebug>

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
    b1.setParent(this);
    b1.setText("close");
    b1.move(100, 100);

    // 初始化 b2
    b2 = new QPushButton(this);
    b2->setText("按钮b2");
    b2->move(50, 50);

    this->resize(400, 300);

    connect(&b1, &QPushButton::pressed, this, &MainWidget::close);

    /*
        &b1  信号发出者 指针类型
        &QPushButton::pressed   处理的信号   &发送者的类名::信号名  --> 函数指针
        this    信号接收者
        &MainWidget::close  槽函数,信号处理函数      &接收的类名::槽函数名  --> 函数指针
    */

    // 自定义槽函数
    // Qt5 任意的成员函数, 普通全局函数, 静态函数
    // 槽函数需要和信号一致(参数, 返回值)
    // 由于信号都是没有返回值, 所以槽函数一定没有返回值

    // b2按钮抬起文本改变
    connect(this->b2, &QPushButton::released, this, &MainWidget::mySlot);

    // b2 按钮抬起按钮1隐藏
    connect(this->b2, &QPushButton::released, &b1, &QPushButton::hide);


    /***************************************************************************************/

    this->setWindowTitle("主窗口");

    b3.setParent(this);
    b3.setText("切换到子窗口");
    b3.move(150, 150);

    // 显示子窗口
    // this->subW.show();

    connect(&b3, &QPushButton::released, this, &MainWidget::changeWidget);

    // 定义函数指针, 指向
    void (SubWidget::*signalP1)() = &SubWidget::mySignals;
    connect(&subW, signalP1, this, &MainWidget::dealSub);

    void (SubWidget::*signalP2)(int, QString) = &SubWidget::mySignals;
    connect(&subW, signalP2, this, &MainWidget::dealSlot);

    QPushButton *b4 = new QPushButton(this);
    b4->setText("Lambda表达式");
    b4->move(200, 200);
    int a = 10, b = 20;
    // lambda 表达式写法, 实际上是个匿名函数
     // mutable 关键字使得外部变量可以被修改

    /*
     * 方括号中的符号
     * 1. = 表示把所有的局部变量, 类中所有的成员变量以值传递的方式传入
     * 2. this 把类中所有的成员以值传递方式传入
     * 3. & 把外部所有的局部变量传入
     *
     **/
    connect(b4, &QPushButton::clicked,
            [=](bool isCheck) mutable
            {
                b4->setText("1233");
                qDebug() << "111111111";
                qDebug() << a << " " << b;
                a = 11;
                qDebug() << a << " " << b;
                qDebug() << isCheck;
            }
    );



}

void MainWidget::mySlot() {
    b2->setText("按钮2释放了..");
}

void MainWidget::changeWidget() {
    this->subW.show();
    this->hide();
}

void MainWidget::dealSub() {
    // 隐藏子窗口
    subW.hide();
    // 显示主窗口
    show();
}

void MainWidget::dealSlot(int a, QString str) {
    qDebug() << "a =" << a << "str =" << str;
}



MainWidget::~MainWidget()
{

}
